package edu.upc.dao.consulta.impl;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import edu.upc.dao.consulta.ConsultaNoticiaDao;
import edu.upc.model.Categoria;
import edu.upc.model.Noticia;
import edu.upc.web.comun.Constantes;

@Component
public class ConsultaNoticiaDaoImpl implements ConsultaNoticiaDao {

	@Autowired
	DataSource dataSource;
	
	public List<Noticia> obtenerNoticiaPorDia() {
		String sql = "SELECT n.id_noti,n.titulo_noti,n.contenido_noti,n.fecha_noti,n.publicacion_noti,n.id_cate, c.descripcion_cate FROM tb_noticias n, tb_categoria c WHERE n.id_cate = c.id_cate AND n.publicacion_noti = 'P' AND n.fecha_noti = ?";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Noticia> lst = new ArrayList<Noticia>();
		try {
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			Calendar cal = Calendar.getInstance();
			ps.setDate(1, new Date(cal.getTimeInMillis()));
			rs = ps.executeQuery();
			lst = mapResult(rs);
		} catch (SQLException e) {
			throw new RuntimeException("SQL exception occurred finding noti by Ofertante", e);
		} finally {
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException ex) {
				}
			}
			if (ps != null) {
				try {
					ps.close();
				} catch (SQLException ex) {
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException ex) {
				}
			}
		}
		return lst;
	}
	
	private List<Noticia> mapResult(ResultSet rs) throws SQLException {
		List<Noticia> lstNoticia = new ArrayList<Noticia>();
		while(rs.next()){
			Noticia noticia = new Noticia();
			noticia.setId(Integer.parseInt(rs.getString("id_noti")));
			noticia.setTituloNoticia(rs.getString("titulo_noti"));
			noticia.setContenidoNoticia(rs.getString("contenido_noti"));
			noticia.setFechaNoticia(rs.getDate("fecha_noti"));
			noticia.setPublicacion(rs.getString("publicacion_noti"));

			Categoria categoria = new Categoria();
			categoria.setId(rs.getInt("id_cate"));
			categoria.setDescripcionCategoria(rs.getString("descripcion_cate"));
			noticia.setCategoria(categoria);

			lstNoticia.add(noticia);
		}

		return lstNoticia;
	}

	public List<Noticia> obtenerNoticiaPorPublicacion(String publicacion) {
		String sql = "";
		if(Constantes.ESTADO_BLANCO.equals(publicacion)){
			sql = "SELECT n.id_noti,n.titulo_noti,n.contenido_noti,n.fecha_noti,n.publicacion_noti,n.id_cate, c.descripcion_cate FROM tb_noticias n, tb_categoria c WHERE n.id_cate = c.id_cate";
		}else{
			sql = "SELECT n.id_noti,n.titulo_noti,n.contenido_noti,n.fecha_noti,n.publicacion_noti,n.id_cate, c.descripcion_cate FROM tb_noticias n, tb_categoria c WHERE n.id_cate = c.id_cate AND n.publicacion_noti = ?";
		}
			
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Noticia> lst = new ArrayList<Noticia>();
		try {
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			if(!Constantes.ESTADO_BLANCO.equals(publicacion)){ ps.setString(1, publicacion); }
			rs = ps.executeQuery();
			lst = mapResult(rs);
		} catch (SQLException e) {
			throw new RuntimeException("SQL exception occurred finding noti by Ofertante", e);
		} finally {
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException ex) {
				}
			}
			if (ps != null) {
				try {
					ps.close();
				} catch (SQLException ex) {
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException ex) {
				}
			}
		}
		return lst;
	}

}
